home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / patches / dungeon.lha / Dungeon / Source.lha / dverb2.c < prev    next >
C/C++ Source or Header  |  1995-10-15  |  17KB  |  697 lines

  1. /* SAVE- SAVE GAME STATE */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include <stdio.h>
  8. #include "funcs.h"
  9. #include "vars.h"
  10.  
  11. /* DECLARATIONS */
  12.  
  13. static integer cxappl_ P((integer));
  14.  
  15. void savegm_()
  16. {
  17.     /* Local variables */
  18.     integer i;
  19.     FILE *e;
  20.  
  21.     prsvec_1.prswon = FALSE_;
  22. /*                         !DISABLE GAME. */
  23. /* Note: save file format is different for PDP vs. non-PDP versions */
  24.  
  25.     char filename[256];
  26.  
  27.     if (AmigaSave(filename) == 0)
  28.     goto L100;
  29.     if ((e = fopen(filename, BINWRITE)) == NULL)
  30.     goto L100;
  31.  
  32.     gttime_(&i);
  33. /*                         !GET TIME. */
  34.  
  35. #define do_uio(i, zbuf, cbytes) \
  36.     (void) fwrite((const char *)(zbuf), (cbytes), (i), e)
  37.  
  38.     do_uio(1, &vers_1.vmaj, sizeof(integer));
  39.     do_uio(1, &vers_1.vmin, sizeof(integer));
  40.     do_uio(1, &vers_1.vedit, sizeof(integer));
  41.  
  42.     do_uio(1, &play_1.winner, sizeof(integer));
  43.     do_uio(1, &play_1.here, sizeof(integer));
  44.     do_uio(1, &hack_1.thfpos, sizeof(integer));
  45.     do_uio(1, &play_1.telflg, sizeof(logical));
  46.     do_uio(1, &hack_1.thfflg, sizeof(logical));
  47.     do_uio(1, &hack_1.thfact, sizeof(logical));
  48.     do_uio(1, &hack_1.swdact, sizeof(logical));
  49.     do_uio(1, &hack_1.swdsta, sizeof(integer));
  50.     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
  51.  
  52.     do_uio(1, &i, sizeof(integer));
  53.     do_uio(1, &state_1.moves, sizeof(integer));
  54.     do_uio(1, &state_1.deaths, sizeof(integer));
  55.     do_uio(1, &state_1.rwscor, sizeof(integer));
  56.     do_uio(1, &state_1.egscor, sizeof(integer));
  57.     do_uio(1, &state_1.mxload, sizeof(integer));
  58.     do_uio(1, &state_1.ltshft, sizeof(integer));
  59.     do_uio(1, &state_1.bloc, sizeof(integer));
  60.     do_uio(1, &state_1.mungrm, sizeof(integer));
  61.     do_uio(1, &state_1.hs, sizeof(integer));
  62.     do_uio(1, &screen_1.fromdr, sizeof(integer));
  63.     do_uio(1, &screen_1.scolrm, sizeof(integer));
  64.     do_uio(1, &screen_1.scolac, sizeof(integer));
  65.  
  66.     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
  67.     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
  68.     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
  69.     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
  70.     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
  71.     do_uio(220, &objcts_1.otval[0], sizeof(integer));
  72.     do_uio(220, &objcts_1.osize[0], sizeof(integer));
  73.     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
  74.     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
  75.     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
  76.     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
  77.  
  78.     do_uio(200, &rooms_1.rval[0], sizeof(integer));
  79.     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
  80.  
  81.     do_uio(4, &advs_1.aroom[0], sizeof(integer));
  82.     do_uio(4, &advs_1.ascore[0], sizeof(integer));
  83.     do_uio(4, &advs_1.avehic[0], sizeof(integer));
  84.     do_uio(4, &advs_1.astren[0], sizeof(integer));
  85.     do_uio(4, &advs_1.aflag[0], sizeof(integer));
  86.  
  87.     do_uio(46, &flags[0], sizeof(logical));
  88.     do_uio(22, &switch_[0], sizeof(integer));
  89.     do_uio(4, &vill_1.vprob[0], sizeof(integer));
  90.     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
  91.     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
  92.  
  93. #undef do_uio
  94.  
  95.     if (fclose(e) == EOF)
  96.     goto L100;
  97.  
  98.     rspeak_(597);
  99.     return;
  100.  
  101. L100:
  102.     rspeak_(598);
  103. /*                         !CANT DO IT. */
  104. } /* savegm_ */
  105.  
  106. /* RESTORE- RESTORE GAME STATE */
  107.  
  108. /* DECLARATIONS */
  109.  
  110. void rstrgm_()
  111. {
  112.     /* Local variables */
  113.     integer i, j, k;
  114.     FILE *e;
  115.  
  116.     prsvec_1.prswon = FALSE_;
  117. /*                         !DISABLE GAME. */
  118. /* Note: save file format is different for PDP vs. non-PDP versions */
  119.  
  120.     char filename[256];
  121.  
  122.     if (AmigaLoad(filename) == 0)
  123.     goto L100;
  124.     if ((e = fopen(filename, BINREAD)) == NULL)
  125.     goto L100;
  126.  
  127. #define do_uio(i, zbuf, cbytes) \
  128.     (void)fread((char *)(zbuf), (cbytes), (i), e)
  129.  
  130.     do_uio(1, &i, sizeof(integer));
  131.     do_uio(1, &j, sizeof(integer));
  132.     do_uio(1, &k, sizeof(integer));
  133.  
  134.     if (i != vers_1.vmaj | j != vers_1.vmin) {
  135.     goto L200;
  136.     }
  137.  
  138.     do_uio(1, &play_1.winner, sizeof(integer));
  139.     do_uio(1, &play_1.here, sizeof(integer));
  140.     do_uio(1, &hack_1.thfpos, sizeof(integer));
  141.     do_uio(1, &play_1.telflg, sizeof(logical));
  142.     do_uio(1, &hack_1.thfflg, sizeof(logical));
  143.     do_uio(1, &hack_1.thfact, sizeof(logical));
  144.     do_uio(1, &hack_1.swdact, sizeof(logical));
  145.     do_uio(1, &hack_1.swdsta, sizeof(integer));
  146.     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
  147.  
  148.     do_uio(1, &time_1.pltime, sizeof(integer));
  149.     do_uio(1, &state_1.moves, sizeof(integer));
  150.     do_uio(1, &state_1.deaths, sizeof(integer));
  151.     do_uio(1, &state_1.rwscor, sizeof(integer));
  152.     do_uio(1, &state_1.egscor, sizeof(integer));
  153.     do_uio(1, &state_1.mxload, sizeof(integer));
  154.     do_uio(1, &state_1.ltshft, sizeof(integer));
  155.     do_uio(1, &state_1.bloc, sizeof(integer));
  156.     do_uio(1, &state_1.mungrm, sizeof(integer));
  157.     do_uio(1, &state_1.hs, sizeof(integer));
  158.     do_uio(1, &screen_1.fromdr, sizeof(integer));
  159.     do_uio(1, &screen_1.scolrm, sizeof(integer));
  160.     do_uio(1, &screen_1.scolac, sizeof(integer));
  161.  
  162.     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
  163.     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
  164.     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
  165.     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
  166.     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
  167.     do_uio(220, &objcts_1.otval[0], sizeof(integer));
  168.     do_uio(220, &objcts_1.osize[0], sizeof(integer));
  169.     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
  170.     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
  171.     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
  172.     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
  173.  
  174.     do_uio(200, &rooms_1.rval[0], sizeof(integer));
  175.     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
  176.  
  177.     do_uio(4, &advs_1.aroom[0], sizeof(integer));
  178.     do_uio(4, &advs_1.ascore[0], sizeof(integer));
  179.     do_uio(4, &advs_1.avehic[0], sizeof(integer));
  180.     do_uio(4, &advs_1.astren[0], sizeof(integer));
  181.     do_uio(4, &advs_1.aflag[0], sizeof(integer));
  182.  
  183.     do_uio(46, &flags[0], sizeof(logical));
  184.     do_uio(22, &switch_[0], sizeof(integer));
  185.     do_uio(4, &vill_1.vprob[0], sizeof(integer));
  186.     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
  187.     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
  188.  
  189.     (void)fclose(e);
  190.  
  191.     rspeak_(599);
  192.     return;
  193.  
  194. L100:
  195.     rspeak_(598);
  196. /*                         !CANT DO IT. */
  197.     return;
  198.  
  199. L200:
  200.     rspeak_(600);
  201. /*                         !OBSOLETE VERSION */
  202.     (void)fclose(e);
  203. } /* rstrgm_ */
  204.  
  205. /* WALK- MOVE IN SPECIFIED DIRECTION */
  206.  
  207. /* DECLARATIONS */
  208.  
  209. logical walk_()
  210. {
  211.     /* System generated locals */
  212.     logical ret_val;
  213.  
  214.     ret_val = TRUE_;
  215. /*                         !ASSUME WINS. */
  216.     if (play_1.winner != aindex_1.player || lit_(play_1.here) || prob_(25,
  217.         25)) {
  218.     goto L500;
  219.     }
  220.     if (! findxt_(prsvec_1.prso, play_1.here)) {
  221.     goto L450;
  222.     }
  223. /*                         !INVALID EXIT? GRUE */
  224. /*                         ! */
  225.     switch (curxt_1.xtype) {
  226.     case 1:  goto L400;
  227.     case 2:  goto L200;
  228.     case 3:  goto L100;
  229.     case 4:  goto L300;
  230.     }
  231. /*                         !DECODE EXIT TYPE. */
  232.     bug_(9, curxt_1.xtype);
  233.  
  234. L100:
  235.     if (cxappl_(curxt_1.xactio) != 0) {
  236.     goto L400;
  237.     }
  238. /*                         !CEXIT... RETURNED ROOM? */
  239.     if (flags[*xflag - 1]) {
  240.     goto L400;
  241.     }
  242. /*                         !NO, FLAG ON? */
  243. L200:
  244.     jigsup_(523);
  245. /*                         !BAD EXIT, GRUE */
  246. /*                         ! */
  247.     return ret_val;
  248.  
  249. L300:
  250.     if (cxappl_(curxt_1.xactio) != 0) {
  251.     goto L400;
  252.     }
  253. /*                         !DOOR... RETURNED ROOM? */
  254.     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
  255.     goto L400;
  256.     }
  257. /*                         !NO, DOOR OPEN? */
  258.     jigsup_(523);
  259. /*                         !BAD EXIT, GRUE */
  260. /*                         ! */
  261.     return ret_val;
  262.  
  263. L400:
  264.     if (lit_(curxt_1.xroom1)) {
  265.     goto L900;
  266.     }
  267. /*                         !VALID ROOM, IS IT LIT? */
  268. L450:
  269.     jigsup_(522);
  270. /*                         !NO, GRUE */
  271. /*                         ! */
  272.     return ret_val;
  273.  
  274. /* ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE). */
  275.  
  276. L500:
  277.     if (findxt_(prsvec_1.prso, play_1.here)) {
  278.     goto L550;
  279.     }
  280. /*                         !EXIT EXIST? */
  281. L525:
  282.     curxt_1.xstrng = 678;
  283. /*                         !ASSUME WALL. */
  284.     if (prsvec_1.prso == xsrch_1.xup) {
  285.     curxt_1.xstrng = 679;
  286.     }
  287. /*                         !IF UP, CANT. */
  288.     if (prsvec_1.prso == xsrch_1.xdown) {
  289.     curxt_1.xstrng = 680;
  290.     }
  291. /*                         !IF DOWN, CANT. */
  292.     if ((rooms_1.rflag[play_1.here - 1] & RNWALL) != 0) {
  293.     curxt_1.xstrng = 524;
  294.     }
  295.     rspeak_(curxt_1.xstrng);
  296.     prsvec_1.prscon = 1;
  297. /*                         !STOP CMD STREAM. */
  298.     return ret_val;
  299.  
  300. L550:
  301.     switch (curxt_1.xtype) {
  302.     case 1:  goto L900;
  303.     case 2:  goto L600;
  304.     case 3:  goto L700;
  305.     case 4:  goto L800;
  306.     }
  307. /*                         !BRANCH ON EXIT TYPE. */
  308.     bug_(9, curxt_1.xtype);
  309.  
  310. L700:
  311.     if (cxappl_(curxt_1.xactio) != 0) {
  312.     goto L900;
  313.     }
  314. /*                         !CEXIT... RETURNED ROOM? */
  315.     if (flags[*xflag - 1]) {
  316.     goto L900;
  317.     }
  318. /*                         !NO, FLAG ON? */
  319. L600:
  320.     if (curxt_1.xstrng == 0) {
  321.     goto L525;
  322.     }
  323. /*                         !IF NO REASON, USE STD. */
  324.     rspeak_(curxt_1.xstrng);
  325. /*                         !DENY EXIT. */
  326.     prsvec_1.prscon = 1;
  327. /*                         !STOP CMD STREAM. */
  328.     return ret_val;
  329.  
  330. L800:
  331.     if (cxappl_(curxt_1.xactio) != 0) {
  332.     goto L900;
  333.     }
  334. /*                         !DOOR... RETURNED ROOM? */
  335.     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
  336.     goto L900;
  337.     }
  338. /*                         !NO, DOOR OPEN? */
  339.     if (curxt_1.xstrng == 0) {
  340.     curxt_1.xstrng = 525;
  341.     }
  342. /*                         !IF NO REASON, USE STD. */
  343.     rspsub_(curxt_1.xstrng, objcts_1.odesc2[curxt_1.xobj - 1]);
  344.     prsvec_1.prscon = 1;
  345. /*                         !STOP CMD STREAM. */
  346.     return ret_val;
  347.  
  348. L900:
  349.     ret_val = moveto_(curxt_1.xroom1, play_1.winner);
  350. /*                         !MOVE TO ROOM. */
  351.     if (ret_val) {
  352.     ret_val = rmdesc_(0);
  353.     }
  354. /*                         !DESCRIBE ROOM. */
  355.     return ret_val;
  356. } /* walk_ */
  357.  
  358. /* CXAPPL- CONDITIONAL EXIT PROCESSORS */
  359.  
  360. /* DECLARATIONS */
  361.  
  362. static integer cxappl_(ri)
  363. integer ri;
  364. {
  365.     /* System generated locals */
  366.     integer ret_val, i__1;
  367.  
  368.     /* Local variables */
  369.     integer i, j, k;
  370.     integer nxt;
  371.     integer ldir;
  372.  
  373.     ret_val = 0;
  374. /*                         !NO RETURN. */
  375.     if (ri == 0) {
  376.     return ret_val;
  377.     }
  378. /*                         !IF NO ACTION, DONE. */
  379.     switch (ri) {
  380.     case 1:  goto L1000;
  381.     case 2:  goto L2000;
  382.     case 3:  goto L3000;
  383.     case 4:  goto L4000;
  384.     case 5:  goto L5000;
  385.     case 6:  goto L6000;
  386.     case 7:  goto L7000;
  387.     case 8:  goto L8000;
  388.     case 9:  goto L9000;
  389.     case 10:  goto L10000;
  390.     case 11:  goto L11000;
  391.     case 12:  goto L12000;
  392.     case 13:  goto L13000;
  393.     case 14:  goto L14000;
  394.     }
  395.     bug_(5, ri);
  396.  
  397. /* C1- COFFIN-CURE */
  398.  
  399. L1000:
  400.     findex_1.egyptf = objcts_1.oadv[oindex_1.coffi - 1] != play_1.winner;
  401. /*                         !T IF NO COFFIN. */
  402.     return ret_val;
  403.  
  404. /* C2- CAROUSEL EXIT */
  405. /* C5- CAROUSEL OUT */
  406.  
  407. L2000:
  408.     if (findex_1.caroff) {
  409.     return ret_val;
  410.     }
  411. /*                         !IF FLIPPED, NOTHING. */
  412. L2500:
  413.     rspeak_(121);
  414. /*                         !SPIN THE COMPASS. */
  415. L5000:
  416.     i = xpars_1.xelnt[xpars_1.xcond - 1] * rnd_(8);
  417. /*                         !CHOOSE RANDOM EXIT. */
  418.     curxt_1.xroom1 = exits_1.travel[rooms_1.rexit[play_1.here - 1] + i - 1] & 
  419.         xpars_1.xrmask;
  420.     ret_val = curxt_1.xroom1;
  421. /*                         !RETURN EXIT. */
  422.     return ret_val;
  423.  
  424. /* C3- CHIMNEY FUNCTION */
  425.  
  426. L3000:
  427.     findex_1.litldf = FALSE_;
  428. /*                         !ASSUME HEAVY LOAD. */
  429.     j = 0;
  430.     i__1 = objcts_1.olnt;
  431.     for (i = 1; i <= i__1; ++i) {
  432. /*                         !COUNT OBJECTS. */
  433.     if (objcts_1.oadv[i - 1] == play_1.winner) {
  434.         ++j;
  435.     }
  436. /* L3100: */
  437.     }
  438.  
  439.     if (j > 2) {
  440.     return ret_val;
  441.     }
  442. /*                         !CARRYING TOO MUCH? */
  443.     curxt_1.xstrng = 446;
  444. /*                         !ASSUME NO LAMP. */
  445.     if (objcts_1.oadv[oindex_1.lamp - 1] != play_1.winner) {
  446.     return ret_val;
  447.     }
  448. /*                         !NO LAMP? */
  449.     findex_1.litldf = TRUE_;
  450. /*                         !HE CAN DO IT. */
  451.     if ((objcts_1.oflag2[oindex_1.door - 1] & OPENBT) == 0) {
  452.     objcts_1.oflag2[oindex_1.door - 1] &= ~ TCHBT;
  453.     }
  454.     return ret_val;
  455.  
  456. /* C4-    FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT) */
  457. /* C6-    FROBOZZ FLAG (MAGNET ROOM, REAL EXIT) */
  458.  
  459. L4000:
  460.     if (findex_1.caroff) {
  461.     goto L2500;
  462.     }
  463. /*                         !IF FLIPPED, GO SPIN. */
  464.     findex_1.frobzf = FALSE_;
  465. /*                         !OTHERWISE, NOT AN EXIT. */
  466.     return ret_val;
  467.  
  468. L6000:
  469.     if (findex_1.caroff) {
  470.     goto L2500;
  471.     }
  472. /*                         !IF FLIPPED, GO SPIN. */
  473.     findex_1.frobzf = TRUE_;
  474. /*                         !OTHERWISE, AN EXIT. */
  475.     return ret_val;
  476.  
  477. /* C7-    FROBOZZ FLAG (BANK ALARM) */
  478.  
  479. L7000:
  480.     findex_1.frobzf = objcts_1.oroom[oindex_1.bills - 1] != 0 & 
  481.         objcts_1.oroom[oindex_1.portr - 1] != 0;
  482.     return ret_val;
  483. /* CXAPPL, PAGE 3 */
  484.  
  485. /* C8-    FROBOZZ FLAG (MRGO) */
  486.  
  487. L8000:
  488.     findex_1.frobzf = FALSE_;
  489. /*                         !ASSUME CANT MOVE. */
  490.     if (findex_1.mloc != curxt_1.xroom1) {
  491.     goto L8100;
  492.     }
  493. /*                         !MIRROR IN WAY? */
  494.     if (prsvec_1.prso == xsrch_1.xnorth || prsvec_1.prso == xsrch_1.xsouth) {
  495.     goto L8200;
  496.     }
  497.     if (findex_1.mdir % 180 != 0) {
  498.     goto L8300;
  499.     }
  500. /*                         !MIRROR MUST BE N-S. */
  501.     curxt_1.xroom1 = (curxt_1.xroom1 - rindex_1.mra << 1) + rindex_1.mrae;
  502. /*                         !CALC EAST ROOM. */
  503.     if (prsvec_1.prso > xsrch_1.xsouth) {
  504.     ++curxt_1.xroom1;
  505.     }
  506. /*                         !IF SW/NW, CALC WEST. */
  507. L8100:
  508.     ret_val = curxt_1.xroom1;
  509.     return ret_val;
  510.  
  511. L8200:
  512.     curxt_1.xstrng = 814;
  513. /*                         !ASSUME STRUC BLOCKS. */
  514.     if (findex_1.mdir % 180 == 0) {
  515.     return ret_val;
  516.     }
  517. /*                         !IF MIRROR N-S, DONE. */
  518. L8300:
  519.     ldir = findex_1.mdir;
  520. /*                         !SEE WHICH MIRROR. */
  521.     if (prsvec_1.prso == xsrch_1.xsouth) {
  522.     ldir = 180;
  523.     }
  524.     curxt_1.xstrng = 815;
  525. /*                         !MIRROR BLOCKS. */
  526.     if (ldir > 180 && ! findex_1.mr1f || ldir < 180 && ! findex_1.mr2f) {
  527.     curxt_1.xstrng = 816;
  528.     }
  529.     return ret_val;
  530.  
  531. /* C9-    FROBOZZ FLAG (MIRIN) */
  532.  
  533. L9000:
  534.     if (mrhere_(play_1.here) != 1) {
  535.     goto L9100;
  536.     }
  537. /*                         !MIRROR 1 HERE? */
  538.     if (findex_1.mr1f) {
  539.     curxt_1.xstrng = 805;
  540.     }
  541. /*                         !SEE IF BROKEN. */
  542.     findex_1.frobzf = findex_1.mropnf;
  543. /*                         !ENTER IF OPEN. */
  544.     return ret_val;
  545.  
  546. L9100:
  547.     findex_1.frobzf = FALSE_;
  548. /*                         !NOT HERE, */
  549.     curxt_1.xstrng = 817;
  550. /*                         !LOSE. */
  551.     return ret_val;
  552. /* CXAPPL, PAGE 4 */
  553.  
  554. /* C10-    FROBOZZ FLAG (MIRROR EXIT) */
  555.  
  556. L10000:
  557.     findex_1.frobzf = FALSE_;
  558. /*                         !ASSUME CANT. */
  559.     ldir = (prsvec_1.prso - xsrch_1.xnorth) / xsrch_1.xnorth * 45;
  560. /*                         !XLATE DIR TO DEGREES. */
  561.     if (! findex_1.mropnf || (findex_1.mdir + 270) % 360 != ldir && 
  562.         prsvec_1.prso != xsrch_1.xexit) {
  563.     goto L10200;
  564.     }
  565.     curxt_1.xroom1 = (findex_1.mloc - rindex_1.mra << 1) + rindex_1.mrae + 1 
  566.         - findex_1.mdir / 180;
  567. /*                         !ASSUME E-W EXIT. */
  568.     if (findex_1.mdir % 180 == 0) {
  569.     goto L10100;
  570.     }
  571. /*                         !IF N-S, OK. */
  572.     curxt_1.xroom1 = findex_1.mloc + 1;
  573. /*                         !ASSUME N EXIT. */
  574.     if (findex_1.mdir > 180) {
  575.     curxt_1.xroom1 = findex_1.mloc - 1;
  576.     }
  577. /*                         !IF SOUTH. */
  578. L10100:
  579.     ret_val = curxt_1.xroom1;
  580.     return ret_val;
  581.  
  582. L10200:
  583.     if (! findex_1.wdopnf || (findex_1.mdir + 180) % 360 != ldir && 
  584.         prsvec_1.prso != xsrch_1.xexit) {
  585.     return ret_val;
  586.     }
  587.     curxt_1.xroom1 = findex_1.mloc + 1;
  588. /*                         !ASSUME N. */
  589.     if (findex_1.mdir == 0) {
  590.     curxt_1.xroom1 = findex_1.mloc - 1;
  591.     }
  592. /*                         !IF S. */
  593.     rspeak_(818);
  594. /*                         !CLOSE DOOR. */
  595.     findex_1.wdopnf = FALSE_;
  596.     ret_val = curxt_1.xroom1;
  597.     return ret_val;
  598.  
  599. /* C11-    MAYBE DOOR.  NORMAL MESSAGE IS THAT DOOR IS CLOSED. */
  600. /*     BUT IF LCELL.NE.4, DOOR ISNT THERE. */
  601.  
  602. L11000:
  603.     if (findex_1.lcell != 4) {
  604.     curxt_1.xstrng = 678;
  605.     }
  606. /*                         !SET UP MSG. */
  607.     return ret_val;
  608.  
  609. /* C12-    FROBZF (PUZZLE ROOM MAIN ENTRANCE) */
  610.  
  611. L12000:
  612.     findex_1.frobzf = TRUE_;
  613. /*                         !ALWAYS ENTER. */
  614.     findex_1.cphere = 10;
  615. /*                         !SET SUBSTATE. */
  616.     return ret_val;
  617.  
  618. /* C13-    CPOUTF (PUZZLE ROOM SIZE ENTRANCE) */
  619.  
  620. L13000:
  621.     findex_1.cphere = 52;
  622. /*                         !SET SUBSTATE. */
  623.     return ret_val;
  624. /* CXAPPL, PAGE 5 */
  625.  
  626. /* C14-    FROBZF (PUZZLE ROOM TRANSITIONS) */
  627.  
  628. L14000:
  629.     findex_1.frobzf = FALSE_;
  630. /*                         !ASSSUME LOSE. */
  631.     if (prsvec_1.prso != xsrch_1.xup) {
  632.     goto L14100;
  633.     }
  634. /*                         !UP? */
  635.     if (findex_1.cphere != 10) {
  636.     return ret_val;
  637.     }
  638. /*                         !AT EXIT? */
  639.     curxt_1.xstrng = 881;
  640. /*                         !ASSUME NO LADDER. */
  641.     if (puzzle_1.cpvec[findex_1.cphere] != -2) {
  642.     return ret_val;
  643.     }
  644. /*                         !LADDER HERE? */
  645.     rspeak_(882);
  646. /*                         !YOU WIN. */
  647.     findex_1.frobzf = TRUE_;
  648. /*                         !LET HIM OUT. */
  649.     return ret_val;
  650.  
  651. L14100:
  652.     if (findex_1.cphere != 52 || prsvec_1.prso != xsrch_1.xwest || ! 
  653.         findex_1.cpoutf) {
  654.     goto L14200;
  655.     }
  656.     findex_1.frobzf = TRUE_;
  657. /*                         !YES, LET HIM OUT. */
  658.     return ret_val;
  659.  
  660. L14200:
  661.     for (i = 1; i <= 16; i += 2) {
  662. /*                         !LOCATE EXIT. */
  663.     if (prsvec_1.prso == puzzle_1.cpdr[i - 1]) {
  664.         goto L14400;
  665.     }
  666. /* L14300: */
  667.     }
  668.     return ret_val;
  669. /*                         !NO SUCH EXIT. */
  670.  
  671. L14400:
  672.     j = puzzle_1.cpdr[i];
  673. /*                         !GET DIRECTIONAL OFFSET. */
  674.     nxt = findex_1.cphere + j;
  675. /*                         !GET NEXT STATE. */
  676.     k = 8;
  677. /*                         !GET ORTHOGONAL DIR. */
  678.     if (j < 0) {
  679.     k = -8;
  680.     }
  681.     if ((abs(j) == 1 || abs(j) == 8 || (puzzle_1.cpvec[findex_1.cphere + k - 
  682.         1] == 0 || puzzle_1.cpvec[nxt - k - 1] == 0)) && puzzle_1.cpvec[
  683.         nxt - 1] == 0) {
  684.     goto L14500;
  685.     }
  686.     return ret_val;
  687.  
  688. L14500:
  689.     cpgoto_(nxt);
  690. /*                         !MOVE TO STATE. */
  691.     curxt_1.xroom1 = rindex_1.cpuzz;
  692. /*                         !STAY IN ROOM. */
  693.     ret_val = curxt_1.xroom1;
  694.     return ret_val;
  695.  
  696. } /* cxappl_ */
  697.